#include<stdio.h>
#include<stdlib.h>
#include "../ubicus.h"

typedef struct
{
	char singus;
	char diverge;
	char chaos;
} Entete;

typedef struct
{
	PRECISION x;
	PRECISION y;
} Coordonnee;

typedef union
{
		PRECISION nombre; 
		char t[sizeof(PRECISION)];
} union_float;

Entete lire_entete(FILE * fichier);

char lire_ordre(FILE * fichier);

PRECISION lire_float(FILE * fichier);

Coordonnee lire_coordonee(FILE * fichier);

PRECISION conversion_float(PRECISION entree);

int main()
{
	int i, j;
	char ordre;
	Entete entete;
	Coordonnee xy;
	FILE * fichier=NULL;
	fichier = fopen("./sortie.bin", "rb");
	if(fichier	!= NULL)
	{
		for(i=0; i<20000; i++)
		{
			entete = lire_entete(fichier);
			for(j=0; j<entete.singus; j++)	
			{
				ordre = lire_ordre(fichier);
				xy = lire_coordonee(fichier);
			}
		}
	}
	return(0);
}

Entete lire_entete(FILE * fichier)
{
	char tmp;
	Entete retour;
	fread(&(tmp), sizeof(tmp), 1, fichier);
	retour.singus = (tmp&0x3f);
	retour.diverge = (tmp&1<<7)>>7;
	retour.chaos = (tmp&1<<6)>>6;
	printf("singus %x diverge %x chaos %x\n", retour.singus, retour.diverge, retour.chaos);
	return(retour);
}

char lire_ordre(FILE * fichier)
{
	char tmp;
	fread(&(tmp), sizeof(tmp), 1, fichier);
	printf("	ordre %x\n", tmp);
	return((int)tmp);
}

PRECISION lire_float(FILE * fichier)
{
	PRECISION retour;
	fread(&(retour), sizeof(retour), 1, fichier);
	return(retour);
}

Coordonnee lire_coordonee(FILE * fichier)
{
	Coordonnee retour;
	retour.x = conversion_float(lire_float(fichier));
	retour.y = conversion_float(lire_float(fichier));
	printf("			x %f , y %f\n", retour.x, retour.y);
	return(retour);
}

PRECISION conversion_float(PRECISION entree)
{
	union_float is, os ;
	is.nombre = entree;
#ifdef f	
	os.t[0]=is.t[3];
	os.t[1]=is.t[2];
	os.t[2]=is.t[1];
	os.t[3]=is.t[0];
	printf("		%f, %f\n",is.nombre,os.nombre);
#else
	os.t[0]=is.t[7];
	os.t[1]=is.t[6];
	os.t[2]=is.t[5];
	os.t[3]=is.t[4];
	os.t[4]=is.t[3];
	os.t[5]=is.t[2];
	os.t[6]=is.t[1];
	os.t[7]=is.t[0];
	printf("		%lf, %lf\n",is.nombre,os.nombre);
#endif
	
	return (os.nombre);
}
